/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores;

import estructurassa.controladores.ABMCentroDeTrabajo.ControladorABMCentroDeTrabajo;
import estructurassa.controladores.ABMClasificacionProducto.ControladorABMClasificacionProducto;
import estructurassa.controladores.ABMMaquinaria.ControladorABMMaquinaria;
import estructurassa.controladores.ABMMaterial.ControladorABMMaterial;
import estructurassa.controladores.ABMOrdenesDeProduccion.ControladorABMOrdenDeProduccion;
import estructurassa.controladores.ABMProducto.ControladorABMProductoTerminado;
import estructurassa.controladores.ABMProductoIntermedio.ControladorABMProductoIntermedio;
import estructurassa.controladores.ABMProveedor.ControladorABMProveedor;
import estructurassa.controladores.ABMRutaFabricacion.ControladorABMRutaFabricacion;
import estructurassa.controladores.ABMTipoMaterial.ControladorABMTipoMaterial;
import estructurassa.controladores.ABMTrabajador.ControladorABMTrabajador;
import estructurassa.controladores.ABMCostosFijos.ControladorABMCostosFijos;
import estructurassa.controladores.ABMDemandasHistorica.ControladorABMDemandasHistoricas;
import estructurassa.controladores.AMBProductoStandar.ControladorABMProductoEstandar;
import estructurassa.controladores.CargarModulosGeneralesDeDemanda.ControladorParametros;
import estructurassa.controladores.ConsultarCostosVariables.ControladorConsultarCostosVariables;
import estructurassa.controladores.PuntoDeEquilibrio.ControladorPuntoEquilibrio;
import estructurassa.controladores.Stock.ControladorStock;
import estructurassa.controladores.menuPrincipal.ControladorMenuPrincipal;
import estructurassa.controladores.ordenesCompra.ControladorOrdenCompra;
import estructurassa.controladores.prediccionDemanda.promedioMovilPonderado.ControladorPredicionDemandaPromMovPond;
import java.util.HashMap;

/**
 *
 * @author Diego
 */
public class FabricaControladores {

    private HashMap<controladoresNombre, Controlador> controladores = new HashMap<>();

    public enum controladoresNombre {

        PRINCIPAL, MENU_INICIAL, ABM_TIPO_MATERIAL, ABM_PRODUCTO_TERMINADO, ABM_MATERIAL, ABM_CENTRO_TRABAJO, ABM_ORDEN_PRODUCCION, ABM_CLASIFICACION_PRODUCTO,
        ABM_TRABAJADOR, ABM_PROVEEDOR, ABM_RUTA_DE_FABRICACION, ABM_MAQUINARIA, ABM_PRODUCTO_INTERMEDIO, CONSULTAR_COSTOS_VARIABLES,
        ABM_COSTOS_FIJOS, ABM_PRODUCTO_ESTANDAR, STOCK, ORDENES_COMPRA, PUNTO_DE_EQUILIBRIO, PREDICCION_DEM_PRO_PON, ABM_DEMANDA, PARAMETROS_DEMANDA
    }

    private FabricaControladores() {
    }

    public static FabricaControladores getInstance() {
        return FabricaControladoresHolder.INSTANCE;
    }

    private static class FabricaControladoresHolder {

        private static final FabricaControladores INSTANCE = new FabricaControladores();
    }

    public Controlador getControlador(controladoresNombre nombre) {

        Controlador controlador = controladores.get(nombre);

        if (controlador != null) {
            return controlador;
        }

        switch (nombre) {
            case MENU_INICIAL:
                controlador = new ControladorMenuPrincipal();
                break;
            case PRINCIPAL:
                controlador = new ControladorPrincipal();
                break;
            case ABM_TIPO_MATERIAL:
                controlador = new ControladorABMTipoMaterial();
                break;
            case ABM_PRODUCTO_TERMINADO:
                controlador = new ControladorABMProductoTerminado();
                break;
            case ABM_MATERIAL:
                controlador = new ControladorABMMaterial();
                break;
            case ABM_CENTRO_TRABAJO:
                controlador = new ControladorABMCentroDeTrabajo();
                break;
            case ABM_ORDEN_PRODUCCION:
                controlador = new ControladorABMOrdenDeProduccion();
                break;
            case ABM_CLASIFICACION_PRODUCTO:
                controlador = new ControladorABMClasificacionProducto();
                break;
            case ABM_TRABAJADOR:
                controlador = new ControladorABMTrabajador();
                break;
            case ABM_PROVEEDOR:
                controlador = new ControladorABMProveedor();
                break;
            case ABM_RUTA_DE_FABRICACION:
                controlador = new ControladorABMRutaFabricacion();
                break;
            case ABM_MAQUINARIA:
                controlador = new ControladorABMMaquinaria();
                break;
            case ABM_PRODUCTO_INTERMEDIO:
                controlador = new ControladorABMProductoIntermedio();
                break;
            case ABM_COSTOS_FIJOS:
                controlador = new ControladorABMCostosFijos();
                break;
            case CONSULTAR_COSTOS_VARIABLES:
                controlador = new ControladorConsultarCostosVariables();
                break;
            case ABM_PRODUCTO_ESTANDAR:
                controlador = new ControladorABMProductoEstandar();
                break;
            case STOCK:
                controlador = new ControladorStock();
                break;
            case ORDENES_COMPRA:
                controlador = new ControladorOrdenCompra();
                break;
            case PUNTO_DE_EQUILIBRIO:
                controlador = new ControladorPuntoEquilibrio();
                break;
            case PREDICCION_DEM_PRO_PON:
                controlador = new ControladorPredicionDemandaPromMovPond();
                break;
            case ABM_DEMANDA:
                controlador = new ControladorABMDemandasHistoricas();
                break;
            case PARAMETROS_DEMANDA:
                controlador = new ControladorParametros();
                break;
        }
        controladores.put(nombre, controlador);
        return controlador;

    }
}
